#ifndef OLED_H__
#define OLED_H__

#include "stm32f1xx_hal.h"	// 包含HAL库

/* BMP图片说明 
    图片格式为位映射，索引分别对应图片的宽和高，
        BMP_xx[H/8][L];
*/
extern const uint8_t BMP_Picture[64/8][64];

/* 像素状态枚举 */
typedef enum 
{
    SET_PIXEL = 0x01,
    RESET_PIXEL = 0x00, 
} PixelStatus;

/**
 * @brief 通过I2C写入一个字节数据
 * @param regAddr: 要写入数据的地址，取值范围为0x00 - 0xFF
 * @param data: 要写入的字节数据，取值范围为0x00 - 0xFF
 * @retval 无
 */
void HW_OLED_WriteByte(uint8_t regAddr, uint8_t data);

/**
 * @brief 写命令
 * @param iicCommand: 要写入的IIC命令，取值范围为0x00 - 0xFF
 * @retval 无
 */
void HW_OLED_WriteCmd(uint8_t iicCommand);

/**
 * @brief 写数据
 * @param iicData: 要写入的IIC数据，取值范围为0x00 - 0xFF
 * @retval 无
 */
void HW_OLED_WriteDat(uint8_t iicData);

/**
 * @brief 初始化OLED模块
 * @param 无
 * @retval 无
 */
void HW_OLED_Init(void);

/**
 * @brief 打开OLED显示
 * @param 无
 * @retval 无
 */
void HW_OLED_On(void);

/**
 * @brief 关闭OLED显示 -- 睡眠模式下，OLED功耗小于10uA
 * @param 无
 * @retval 无
 */
void HW_OLED_Off(void);

/**
 * @brief 全量刷新
 * @param 无
 * @retval 无
 */
void HW_OLED_RefreshRAM(void);

/**
 * @brief 清空数据缓存
 * @param 无
 * @retval 无
 */
void HW_OLED_ClearRAM(void);

/**
 * @brief 全屏填充 0x00~0xff
 * @param fillData: 填充数据（1字节），取值范围为0x00 - 0xFF
 * @retval 无
 */
void HW_OLED_FullyFill(uint8_t fillData);

/**
 * @brief 全屏清空
 * @param 无
 * @retval 无
 */
void HW_OLED_FullyClear(void);

/**
 * @brief 设置指定像素点的状态
 * @param x: 起始横坐标，取值范围为0 - 127
 * @param y: 起始纵坐标，取值范围为0 - 63
 * @param setPixel: 设置像素状态，取值为SET_PIXEL（点亮像素）或RESET_PIXEL（熄灭像素）
 * @retval 无
 */
void HW_OLED_SetPixel(int16_t x, int16_t y, uint8_t setPixel);

/**
 * @brief 获取指定像素点的状态
 * @param x: 起始横坐标，取值范围为0 - 127
 * @param y: 起始纵坐标，取值范围为0 - 63
 * @retval PixelStatus: 返回像素的状态，SET_PIXEL（像素点亮）或RESET_PIXEL（像素熄灭）
 */
PixelStatus HW_OLED_GetPixel(int16_t x, int16_t y);

/**
 * @brief 显示codetab.h中的ASCII字符，有6*8和8*16可选
 * @param x: 起始横坐标，取值范围为0 - 127
 * @param y: 起始纵坐标，取值范围为0 - 63
 * @param str[]: 要显示的字符串
 * @param textSize: 字体大小，取值为1（6*8字体）或2（8*16字体）
 * @retval 无
 */
void HW_OLED_ShowStr(int16_t x, int16_t y, uint8_t str[], uint8_t textSize);

/**
 * @brief 显示codetab.h中的汉字，16*16点阵
 * @param x: 起始横坐标，取值范围为0 - 127
 * @param y: 起始纵坐标，取值范围为0 - 7
 * @param str: 对应codetab.h中的汉字
 * @retval 无
 */
void HW_OLED_ShowCN(int16_t x, int16_t y, uint8_t* str);

/**
 * @brief 显示codetab.h中的汉字，16*16点阵，英文，8*16点阵
 * @param x: 起始横坐标，取值范围为0 - 127
 * @param y: 起始纵坐标，取值范围为0 - 7
 * @param str: 对应codetab.h中的汉字和英文
 * @retval 无
 */
void HW_OLED_ShowMixedCH(int16_t x, int16_t y, uint8_t* str);

/**
 * @brief 图片显示函数，显示BMP位图，格式使用二维数组存储
 * @param x0: 起始横坐标，取值范围为0 - 127
 * @param y0: 起始纵坐标，取值范围为0 - 63
 * @param width: 图片长度，取值需保证图片不会超出屏幕范围
 * @param height: 图片高度，取值需保证图片不会超出屏幕范围
 * @param bmpData: 位图数据
 * @retval 无
 */
void HW_OLED_DrawBMP(int16_t x0, int16_t y0, int16_t width, int16_t height, const uint8_t bmpData[]);

/**
 * @brief 区域填充
 * @param x0: 起始横坐标，取值范围为0 - 127
 * @param y0: 起始纵坐标，取值范围为0 - 63
 * @param width: 填充区域长度，取值需保证区域不会超出屏幕范围
 * @param height: 填充区域高度，取值需保证区域不会超出屏幕范围
 * @param fillData: 填充数据，取值范围为0x00 - 0xFF
 * @retval 无
 */
void HW_OLED_AreaFill(int16_t x0, int16_t y0, int16_t width, int16_t height, uint8_t fillData);

/**
 * @brief 区域清空
 * @param x0: 起始横坐标，取值范围为0 - 127
 * @param y0: 起始纵坐标，取值范围为0 - 63
 * @param width: 清空区域长度，取值需保证区域不会超出屏幕范围
 * @param height: 清空区域高度，取值需保证区域不会超出屏幕范围
 * @retval 无
 */
void HW_OLED_AreaClear(int16_t x0, int16_t y0, int16_t width, int16_t height);

/**
 * @brief 全屏反色显示
 * @param 无
 * @retval 无
 */
void HW_OLED_FullyToggle(void);

/**
 * @brief 区域反色显示
 * @param x0: 起始横坐标，取值范围为0 - 127
 * @param y0: 起始纵坐标，取值范围为0 - 63
 * @param width: 反色区域长度，取值需保证区域不会超出屏幕范围
 * @param height: 反色区域高度，取值需保证区域不会超出屏幕范围
 * @retval 无
 */
void HW_OLED_AreaToggle(int16_t x0, int16_t y0, int16_t width, int16_t height);

/**
 * @brief 全屏垂直滚动显示
 * @param 无
 * @retval 无
 */
void HW_OLED_VerticalShift(void);

/**
 * @brief 全屏水平滚动显示
 * @param direction: 滚动方向，具体取值含义需根据实际实现确定
 * @retval 无
 */
void HW_OLED_HorizontalShift(uint8_t direction);

/**
 * @brief 全屏同时垂直和水平滚动显示
 * @param direction: 滚动方向，具体取值含义需根据实际实现确定
 * @retval 无
 */
void HW_OLED_VerticalAndHorizontalShift(uint8_t direction);

/**
 * @brief 屏幕显示模式选择
 * @param mode: 显示模式，具体取值含义需根据实际实现确定
 * @retval 无
 */
void HW_OLED_DisplayMode(uint8_t mode);

/**
 * @brief 屏幕亮度控制
 * @param intensity: 亮度值，取值范围需根据实际硬件确定
 * @retval 无
 */
void HW_OLED_IntensityControl(uint8_t intensity);

#endif

